home *** CD-ROM | disk | FTP | other *** search
/ HTBasic 9.3 / HTBasic 9.3.iso / 83win / data1.cab / Basic_Plus_Examples / RCKSCIPR < prev    next >
Text File  |  2001-03-02  |  9KB  |  252 lines

  1. 10    ! ******************************************************************
  2. 20    ! Example: Rock/Paper/Scissors Game
  3. 30    !
  4. 40    ! This program is designed to show the operation of LABEL and
  5. 50    ! PUSHBUTTON widgets. It plays the game of "rock/paper/scissors"
  6. 60    ! in which each of two players guesses one of three items -
  7. 70    ! rock, paper, or scissors. The guesses are then compared
  8. 80    ! for the following outcomes:
  9. 90    !
  10. 100    !  - An identical guess is a tie
  11. 110    !  - Paper covers rock, paper wins
  12. 120    !  - Scissors cuts paper, scissors wins
  13. 130    !  - Rock breaks scissors, rock wins
  14. 140    !
  15. 150    ! The program sets up a panel with a large LABEL to prompt the user
  16. 160    ! for his or her guess, sets up a PUSHBUTTON for each guess, then
  17. 170    ! goes into a loop where it waits for PUSHBUTTON input.
  18. 180    !
  19. 190    ! Each one of the three PUSHBUTTON widgets causes an event that invokes
  20. 200    ! the appropriate handler routine. These three routines each contain
  21. 210    ! a SELECT statement that matches the PUSHBUTTON against a guess made
  22. 220    ! by the program -- rock, scissors, or paper.  On the basis of the
  23. 230    ! match, each routine then provides a dialog indicating the match and
  24. 240    ! calls the appropriate Win, Lose, or Tie routine.
  25. 250    !
  26. 260    ! ******************************************************************
  27. 270   !
  28. 280  RANDOMIZE INT(FRACT(TIMEDATE)*10^7)
  29. 290   !
  30. 300   ! Variables Used:
  31. 310   !
  32. 320   ! Me,You,Tie:            Store game outcomes
  33. 330   ! Rock,Paper,Scissors:   Guess values
  34. 340   ! B$,S$:                 General purpose strings
  35. 350   !
  36. 360  INTEGER Me,You,Tie,Rock,Paper,Scissors
  37. 370  DATA 0,0,0,0,1,2
  38. 380  READ Me,You,Tie,Rock,Paper,Scissors
  39. 390   !
  40. 400  INTEGER Black,White,Red,Yellow,Green,Cyan,Blue,Magenta
  41. 410  DATA 0,1,2,3,4,5,6,7
  42. 420  READ Black,White,Red,Yellow,Green,Cyan,Blue,Magenta
  43. 430   !
  44. 440  DIM B$[50],S$[100]
  45. 450  INTEGER Nlines,D(1:4),Dw,Dh          ! Variables for display handling
  46. 460  INTEGER Pw,Ph,Px,Py,Iw,Ih            ! PANEL dimensions & coordinates
  47. 470  INTEGER Gapw,Gaph,W1,H1,W2,H2        ! Widget scaling factors
  48. 480  INTEGER R1,R2,R3,R4,R5,R6,C1,C2,C3
  49. 490   !
  50. 500   ! Get display dimensions
  51. 510   !
  52. 520  STATUS CRT,13;Nlines
  53. 530  GESCAPE CRT,3;D(*)
  54. 540  Dw=D(3)-D(1)
  55. 550  Dh=(D(4)-D(2))*((Nlines-7)/Nlines)
  56. 560   !
  57. 570  Pw=Dw*.5
  58. 580  Ph=Dh*.8
  59. 590  Px=(Dw-Pw)/2
  60. 600  Py=(Dh-Ph)/2
  61. 610   !
  62. 620  CLEAR SCREEN
  63. 630  ASSIGN @Main TO WIDGET "PANEL";SET ("VISIBLE":0)
  64. 640  CONTROL @Main;SET ("MAXIMIZABLE":0,"RESIZABLE":0)
  65. 650  CONTROL @Main;SET ("X":Px,"Y":Py,"WIDTH":Pw,"HEIGHT":Ph)
  66. 660  CONTROL @Main;SET ("TITLE":" Example: Rock/Paper/Scissors Game")
  67. 670  CONTROL @Main;SET ("SYSTEM MENU":"Quit")
  68. 680   !
  69. 690  STATUS @Main;RETURN ("INSIDE WIDTH":Iw,"INSIDE HEIGHT":Ih)
  70. 700   !
  71. 710  Gapw=Iw*.03           ! Width gap
  72. 720  Gaph=Ih*.03           ! Height gap
  73. 730  W1=(Iw-Gapw*4)/3      ! Width of PUSHBUTTONs and most LABELS
  74. 740  H1=(Ih-Gaph*8)/4      ! Height of PUSHBUTTONs and all LABELS
  75. 750  W2=Iw-Gapw*2          ! Width of main LABEL and all SEPARATORs
  76. 760  H2=Gaph               ! Height of SEPARATORs
  77. 770   !
  78. 780  C1=Gapw               ! Column coordinates, based on PUSHBUTTON width
  79. 790  C2=C1+W1+Gapw
  80. 800  C3=C2+W1+Gapw
  81. 810   !
  82. 820  R1=Gaph               ! Row coordinates:  row for main LABEL
  83. 830  R2=R1+H1+Gaph         ! Row for first SEPARATOR
  84. 840  R3=R2+H2+Gaph         ! Row for input PUSHBUTTONs
  85. 850  R4=R3+H1+Gaph         ! Row for second SEPARATOR
  86. 860  R5=R4+H2              ! Row for result-title LABELs
  87. 870  R6=R5+H1              ! Row for result-value LABELs
  88. 880   !
  89. 890   ! Now add child widgets: main LABEL
  90. 900   !
  91. 910  ASSIGN @Label TO WIDGET "LABEL";PARENT @Main
  92. 920  CONTROL @Label;SET ("X":C1,"Y":R1,"WIDTH":W2,"HEIGHT":H1)
  93. 930  CONTROL @Label;SET ("BORDER":0,"BACKGROUND":Black,"PEN":Red)
  94. 940  CONTROL @Label;SET ("PEN":White,"VALUE":"Make a guess!")
  95. 950   !
  96. 960   ! Create SEPARATOR widget
  97. 970   !
  98. 980  ASSIGN @S1 TO WIDGET "SEPARATOR";PARENT @Main
  99. 990  CONTROL @S1;SET ("X":C1,"Y":R2,"WIDTH":W2,"HEIGHT":H2)
  100. 1000  !
  101. 1010  ! User input keys
  102. 1020  !
  103. 1030 ASSIGN @Rock TO WIDGET "PUSHBUTTON";PARENT @Main
  104. 1040 CONTROL @Rock;SET ("X":C1,"Y":R3,"WIDTH":W1,"HEIGHT":H1)
  105. 1050 CONTROL @Rock;SET ("BACKGROUND":Blue,"PEN":White)
  106. 1060 CONTROL @Rock;SET ("LABEL":"ROCK")
  107. 1070  !
  108. 1080 ASSIGN @Scissors TO WIDGET "PUSHBUTTON";PARENT @Main
  109. 1090 CONTROL @Scissors;SET ("X":C2,"Y":R3,"WIDTH":W1,"HEIGHT":H1)
  110. 1100 CONTROL @Scissors;SET ("BACKGROUND":Blue,"PEN":White)
  111. 1110 CONTROL @Scissors;SET ("LABEL":"SCISSORS")
  112. 1120  !
  113. 1130 ASSIGN @Paper TO WIDGET "PUSHBUTTON";PARENT @Main
  114. 1140 CONTROL @Paper;SET ("X":C3,"Y":R3,"WIDTH":W1,"HEIGHT":H1)
  115. 1150 CONTROL @Paper;SET ("BACKGROUND":Blue,"PEN":White)
  116. 1160 CONTROL @Paper;SET ("LABEL":"PAPER")
  117. 1170  !
  118. 1180  ! Next SEPARATOR widget
  119. 1190  !
  120. 1200 ASSIGN @S2 TO WIDGET "SEPARATOR";PARENT @Main
  121. 1210 CONTROL @S2;SET ("X":C1,"Y":R4,"WIDTH":W2,"HEIGHT":H2)
  122. 1220  !
  123. 1230  ! Results titles and values. Note that none of these LABELS have
  124. 1240  ! borders; the titles also have backgrounds that have the same color
  125. 1250  ! as the PANEL background, so they appear to be written directly on
  126. 1260  ! the PANEL.
  127. 1270  !
  128. 1280 ASSIGN @Me_title TO WIDGET "LABEL";PARENT @Main
  129. 1290 CONTROL @Me_title;SET ("X":C1,"Y":R5,"WIDTH":W1,"HEIGHT":H1)
  130. 1300 CONTROL @Me_title;SET ("BORDER":0,"VALUE":"ME")
  131. 1310  !
  132. 1320 ASSIGN @Me_value TO WIDGET "LABEL";PARENT @Main
  133. 1330 CONTROL @Me_value;SET ("X":C1,"Y":R6,"WIDTH":W1,"HEIGHT":H1)
  134. 1340 CONTROL @Me_value;SET ("BORDER":0,"BACKGROUND":Black,"PEN":Red)
  135. 1350 CONTROL @Me_value;SET ("VALUE":Me)
  136. 1360  !
  137. 1370 ASSIGN @You_title TO WIDGET "LABEL";PARENT @Main
  138. 1380 CONTROL @You_title;SET ("X":C2,"Y":R5,"WIDTH":W1,"HEIGHT":H1)
  139. 1390 CONTROL @You_title;SET ("BORDER":0,"VALUE":"YOU")
  140. 1400  !
  141. 1410 ASSIGN @You_value TO WIDGET "LABEL";PARENT @Main
  142. 1420 CONTROL @You_value;SET ("X":C2,"Y":R6,"WIDTH":W1,"HEIGHT":H1)
  143. 1430 CONTROL @You_value;SET ("BORDER":0,"BACKGROUND":Black,"PEN":Green)
  144. 1440 CONTROL @You_value;SET ("VALUE":You)
  145. 1450  !
  146. 1460 ASSIGN @Tie_title TO WIDGET "LABEL";PARENT @Main
  147. 1470 CONTROL @Tie_title;SET ("X":C3,"Y":R5,"WIDTH":W1,"HEIGHT":H1)
  148. 1480 CONTROL @Tie_title;SET ("BORDER":0,"VALUE":"TIE")
  149. 1490  !
  150. 1500 ASSIGN @Tie_value TO WIDGET "LABEL";PARENT @Main
  151. 1510 CONTROL @Tie_value;SET ("X":C3,"Y":R6,"WIDTH":W1,"HEIGHT":H1)
  152. 1520 CONTROL @Tie_value;SET ("BORDER":0,"BACKGROUND":Black,"PEN":Yellow)
  153. 1530 CONTROL @Tie_value;SET ("VALUE":Tie)
  154. 1540  !
  155. 1550  ! PANEL completed, set up EVENTS
  156. 1560  !
  157. 1570 ON EVENT @Rock,"ACTIVATED" GOSUB Gotrock
  158. 1580 ON EVENT @Scissors,"ACTIVATED" GOSUB Gotscissors
  159. 1590 ON EVENT @Paper,"ACTIVATED" GOSUB Gotpaper
  160. 1600 ON EVENT @Main,"SYSTEM MENU" GOTO Finis
  161. 1610  !
  162. 1620  ! Turn on the PANEL, make everything visible, then loop
  163. 1630  !
  164. 1640 CONTROL @Main;SET ("VISIBLE":1)
  165. 1650  !
  166. 1660  ! Main loop, set random-number seed, then loop
  167. 1670  !
  168. 1680 LOOP
  169. 1690     WAIT FOR EVENT
  170. 1700 END LOOP
  171. 1710 STOP
  172. 1720  !
  173. 1730  ! ****************  End of Main Program **********************
  174. 1740  !
  175. 1750  ! The three following handler routines are all basically similar:
  176. 1760  ! each is invoked by one of the three PUSHBUTTONs and uses a SELECT
  177. 1770  ! statement to figure the appropriate outcome. For each outcome, it
  178. 1780  ! loads a string with the appropriate result and calls the appropriate
  179. 1790  ! Win, Lose, or Tie routine.
  180. 1800  !
  181. 1810 Gotrock: !
  182. 1820 SELECT INT(3*RND)
  183. 1830 CASE Rock
  184. 1840     B$="ROCK ON ROCK"
  185. 1850     GOSUB Tie
  186. 1860 CASE Scissors
  187. 1870     B$="ROCK BREAKS SCISSORS"
  188. 1880     GOSUB Win
  189. 1890 CASE Paper
  190. 1900     B$="PAPER COVERS ROCK"
  191. 1910     GOSUB Lose
  192. 1920 END SELECT
  193. 1930 RETURN
  194. 1940  !
  195. 1950 Gotscissors: !
  196. 1960 SELECT INT(3*RND)
  197. 1970 CASE Rock
  198. 1980     B$="ROCK BREAKS SCISSORS"
  199. 1990     GOSUB Lose
  200. 2000 CASE Scissors
  201. 2010     B$="SCISSORS ON SCISSORS"
  202. 2020     GOSUB Tie
  203. 2030 CASE Paper
  204. 2040     B$="SCISSORS CUTS PAPER"
  205. 2050     GOSUB Win
  206. 2060 END SELECT
  207. 2070 RETURN
  208. 2080  !
  209. 2090 Gotpaper: !
  210. 2100 SELECT INT(3*RND)
  211. 2110 CASE Rock
  212. 2120     B$="PAPER COVERS ROCK"
  213. 2130     GOSUB Win
  214. 2140 CASE Scissors
  215. 2150     B$="SCISSORS CUTS PAPER"
  216. 2160     GOSUB Lose
  217. 2170 CASE Paper
  218. 2180     B$="PAPER ON PAPER"
  219. 2190     GOSUB Tie
  220. 2200 END SELECT
  221. 2210 RETURN
  222. 2220  !
  223. 2230  ! The three results routines -- Win, Tie, Lose -- are also similar to
  224. 2240  ! each other. Each takes the result of the match from the calling
  225. 2250  ! routine, concatenates it with the appropriate conclusion, displays
  226. 2260  ! it with a dialog, then increments the appropriate tally and returns.
  227. 2270  !
  228. 2280 Win: !
  229. 2290 S$=B$&": You WIN!"
  230. 2300 DIALOG "INFORMATION",S$;SET ("TITLE":" Results","PEN":Green)
  231. 2310 You=You+1
  232. 2320 CONTROL @You_value;SET ("VALUE":You)
  233. 2330 RETURN
  234. 2340  !
  235. 2350 Tie: !
  236. 2360 S$=B$&": Tie!"
  237. 2370 DIALOG "INFORMATION",S$;SET ("TITLE":" Results","PEN":Yellow)
  238. 2380 Tie=Tie+1
  239. 2390 CONTROL @Tie_value;SET ("VALUE":Tie)
  240. 2400 RETURN
  241. 2410  !
  242. 2420 Lose: !
  243. 2430 S$=B$&": You LOSE!"
  244. 2440 DIALOG "INFORMATION",S$;SET ("TITLE":" Results","PEN":Red)
  245. 2450 Me=Me+1
  246. 2460 CONTROL @Me_value;SET ("VALUE":Me)
  247. 2470 RETURN
  248. 2480  !
  249. 2490 Finis: !
  250. 2500 ASSIGN @Main TO *     ! Delete the PANEL widget
  251. 2510 END
  252.